/*
 * Copyright (c) 2008-2009 Ravenhearte Design
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 * * Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 *
 * * Neither the name of 'Ravenhearte Design' nor the names of its contributors 
 *   may be used to endorse or promote products derived from this software 
 *   without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package org.ravenhearte.hardboild.gamelogic;

import java.util.LinkedList;

import com.jme.math.Vector3f;

public class GameTile {
	private GameMap parent;
	private int[] location;
	private Vector3f worldLocation;
	private GameCharacter character;
	private boolean occupied;
	
	public GameTile(int[] location) {
		this.location = location;
		
		float xTrans, yTrans, zTrans;
		if(location[1] % 2 != 0) {
			xTrans = (float)((location[0] * 1.8) - (1.8 / 2));
		}
		else {
			xTrans = (float)((location[0] * 1.8));
		}
		yTrans = (float)(location[1] * 1.5);
		zTrans = (float)(location[2] * .5);
		worldLocation = new Vector3f(xTrans, yTrans, zTrans);
	}
	
	public int[] getLocation() {
		return location;
	}
	
	public Vector3f getWorldLocation() {
		return worldLocation;
	}
	
	public void setParent(GameMap parent) {
		this.parent = parent;
	}
	
	public GameMap getParent() {
		return parent;
	}
	
	public boolean isOccupied() {
		return occupied;
	}
	
	public GameCharacter getOccupier() {
		return character;
	}
	
	public LinkedList<String> getPossibleNeighbors() {
		LinkedList<String> neighbors = new LinkedList<String>();

		// West
		int[] neighbor = {location[0]-1, location[1], location[2]};
		neighbors.add(GameMap.intArrayToString(neighbor));

		// North
		// Odd rows have neighbors directly above and one to the right
		// Even rows have neighbors one to the left and directly above
		// This checks for directly above
		neighbor = new int[] {location[0], location[1]-1, location[2]};
		neighbors.add(GameMap.intArrayToString(neighbor));

		//This checks for either one to the right or one to the left
		//depending on the row % 2
		if (location[1] % 2 == 1) {
			neighbor = new int[] {location[0]-1, location[1]-1, location[2]};
			neighbors.add(GameMap.intArrayToString(neighbor));
		}
		else {
			neighbor = new int[] {location[0]+1, location[1]-1, location[2]};
			neighbors.add(GameMap.intArrayToString(neighbor));
		}

		//East
		neighbor = new int[] {location[0]+1, location[1], location[2]};
		neighbors.add(GameMap.intArrayToString(neighbor));

		//South
		// Odd rows have neighbors directly below and one to the right
		// Even rows have neighbors one to the left and directly below
		// This checks for directly below
		neighbor = new int[] {location[0], location[1]+1, location[2]};
		neighbors.add(GameMap.intArrayToString(neighbor));

		//This checks for either one to the right or one to the left
		//depending on the row % 2
		if (location[1] % 2 == 1) {
			neighbor = new int[] {location[0]-1, location[1]+1, location[2]};
			neighbors.add(GameMap.intArrayToString(neighbor));
		}
		else {
			neighbor = new int[] {location[0]+1, location[1]+1, location[2]};
			neighbors.add(GameMap.intArrayToString(neighbor));
		}
		
		return neighbors;
	}

	public void placeCharacter(GameCharacter character) {
		occupied = true;
		this.character = character;
		character.setLocation(location);
		character.setTile(this);
	}
	
	public void removeCharacter() {
		occupied = false;
		character.setLocation(new int[]{0, 0, 0});
		character.setTile(null);
		character = null;
	}
}
